home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Source Code
/
Libraries
/
DCLAP 6d
/
dclap6d
/
SeqPups
/
appsrc
/
drawtree.src
/
interface.c
< prev
next >
Wrap
Text File
|
1996-07-05
|
14KB
|
549 lines
/* stderr */
/* Interface
By Sean T. Lamont
For use with the Macntosh version of the Phylogeny Inference Package,
version 3.5c. (c) Copyright 1992 by Joseph Felsenstein.
Permission is granted to copy and use this program provided no fee is
charged for it and provided that this copyright notice is not removed.
This file defines a 2-window environment which replicates many
of the standard c I/O functions (puts, printf,gets,scanf)
in a maclike environment, with a scrollback buffer. This
is necessary because of the very weak implementation of IO under
straight C, and the difficulty of using separate windows. It also
adds the ability to "quit" out of an application while it is running,
and some very basic point-and-click interface type of stuff on the
screen.
Functions you need to know how to use:
macsetup(char *name): initializes the interface, brings up a window of
the name of the argument, for I/O.
macprintf(char *string,arg,arg): like printf but into the window
macgets(char *string); like puts but into the window
macscanf(char *string, arg,arg) like scanf but from the window
macgets (char *string,arg,arg) like gets but from the window.
It is recommended that you include "interface.h" file, which sets
up these #define's for you (IE all calls to scanf will call
macscanf, etc.)
textmode(); makes the current drawing window the text window
gfxmode(); makes the current drawing window the gfx window,
unhides the graphics window.
eventloop(): process mouse events, menus, etc., and wait for
"go away" event. You are implicitly doing this\
when you run macgets/macscanf. If you want to query
the event handler during non-IO periods of time this
would be what to call (or alternatively, printf("");
*/
#include <stdarg.h>
#include <stdio.h>
#include "interface.h"
#define SCROLLLINES 200
#define SCROLLCOLUMNS 80
#define SCROLLMEM 17000
#define LINEDEPTH (int)12
#define PAGELINES (int)(260 / 12)
#define TEXT 0
#define GFX 1
/* Global variables, most for use with input/output */
int disablescrollback = 0;
int mode = TEXT;
WindowPtr gfxWindow;
WindowPtr textWindow;
MenuHandle appleMenu,fileMenu;
char *lines[SCROLLLINES]; /* the scrollback buffer */
int cursorx=0; /* the current x position that the text cursor is at */
int cursory=0; /* the current y position that the text cursor is at */
int numlines_=0;/* the next place we put a new line. */
int memptr=0; /* the next place in our space we get memory from. */
int linectr=0;
/*char *memory; */
char memory[SCROLLMEM]; /*?? << dgg, save data seg for thinkc */
char line[256];/* used to accumulate output before newlines. */
Rect textBounds = {40,5,300,500}; /* position of window 1 */
Rect gfxBounds = {0,0,350,500}; /* position of window 2 */
Rect textrect = {0,0,260,479}; /* region to clear within window */
Rect barBounds = {0,480,260,495}; /* position of the scroll bar */
RgnHandle rgn; /* used by scrollrect */
ControlHandle bar; /* this is the scrollbar control */
int lasttop=0; /* used by update / scrollrect */
char inputs[256]; /* used by the input routines */
int inputcount = 0; /* offset into the string. */
int collect = false; /* boolean: collect chars? */
void macsetup(tname,gname)
char *tname,*gname;
{
static char buf1[128];
static char buf2[128];
strcpy(buf1+1,tname);
strcpy(buf2+1,gname);
buf1[0]=strlen(tname);
buf2[0]=strlen(gname);
MaxApplZone();
#ifdef __MWERKS__
InitGraf(&qd.thePort);
#else
InitGraf(&thePort);
#endif
InitFonts();
FlushEvents(everyEvent,0);
InitWindows();
InitMenus();
TEInit();
InitDialogs(0L);
InitCursor();
/* memory= (char*)malloc(SCROLLMEM); */
textWindow = NewWindow(0L,&textBounds,(ConstStr255Param)buf1,true,documentProc,
(WindowPtr) -1L, true,0);
gfxWindow = NewWindow(0L,&gfxBounds,(ConstStr255Param)buf2,false,noGrowDocProc,
(WindowPtr) -1L, true,0);
rgn=NewRgn();
SetPort(textWindow);
bar=NewControl(textWindow,&barBounds,(ConstStr255Param)"",true,0,0,
0,scrollBarProc,0);
InsertMenu(appleMenu=NewMenu(1,"\p\024"),0); /* add apple menu */
InsertMenu(fileMenu=NewMenu(2,"\pFile"),0); /* add file menu */
TextFont(courier);
TextSize(10);
DrawMenuBar();
AppendMenu(fileMenu,"\pQuit/Q");
AddResMenu(appleMenu, 'DRVR');
macprintf("\n");
}
void queryevent()
{
int status;
status=handleevent();
if (status <= 0)
process_window_closure(status);
}
void eventloop()
{
int status;
while (1){
status=handleevent();
if (status <= 0)
process_window_closure(status); }
}
process_window_closure(status)
int status;
{
if (status == -1){
CloseWindow(gfxWindow); /* "Close main window", so run all the */
CloseWindow(textWindow); /* cleanup stuff. */
DisposeRgn(rgn);
#undef exit
exit(0);
#define exit(status) eventloop()
}
else if (status == 0)
HideWindow(gfxWindow);}
int handleevent()
{
pascal void scroll();
char pstring[256];
OSErr res;
EventRecord ev;
WindowPtr win;
ControlHandle ctrl;
short menuid,menuitem;
Point MouseLoc;
long menu,i;
int cx,cy;
int PathRefNum;
long count=80;
SFReply fileinfo;
char c,pasteword[64];
Str255 name;
GrafPtr savePort;
FILE *fp;
Rect drect;
Rect rect = {0,0,1000,1000}; /* the limit for dragging windows */
int ok=GetNextEvent(everyEvent,&ev);
int where=FindWindow(ev.where,&win);
if (ev.what == keyDown && collect && mode != GFX){
SetCtlValue(bar,GetCtlMax(bar));
redraw(numlines_ - (GetCtlMax(bar) - GetCtlValue(bar)) - PAGELINES);
}
if ((ev.what == keyDown) &&
(ev.modifiers & cmdKey) &&
(toupper((char)(ev.message & charCodeMask)) == 'Q') )
return -1;
if (( ev.what == keyDown ) && collect && mode == GFX){
textmode();
process_char((char)(ev.message & charCodeMask));}
if (ev.what == mouseDown && !disablescrollback && where ==inContent & mode == TEXT){
SelectWindow(win);
GlobalToLocal(&ev.where);
switch (FindControl(ev.where,win,&ctrl)){
case inThumb:
TrackControl(ctrl,ev.where,nil);
break;
case inUpButton:
#if defined(powerc) || defined(__powerc)
{
ControlActionUPP caupp= NewControlActionProc( scroll);
TrackControl (ctrl, ev.where, caupp);
}
#else
TrackControl(ctrl,ev.where,scroll);
#endif
break;
case inPageUp:
SetCtlValue(bar,GetCtlValue(bar) - 10);
break;
case inDownButton:
#if defined(powerc) || defined(__powerc)
{
ControlActionUPP caupp= NewControlActionProc( scroll);
TrackControl (ctrl, ev.where, caupp);
}
#else
TrackControl(ctrl,ev.where,scroll);
#endif
break;
case inPageDown:
SetCtlValue(bar,GetCtlValue(bar) + 10);
break;
default:
if (collect && mode == TEXT){
GetMouse(&MouseLoc);
cy = (int)((double)MouseLoc.v / (double)(LINEDEPTH)) +
(numlines_ - (GetCtlMax(bar) - GetCtlValue(bar))
- PAGELINES + 1);
for (i=0;i<strlen(lines[cy%SCROLLLINES]);++i)
if ((lines[cy%SCROLLLINES])[i] == '(' ||
(lines[cy%SCROLLLINES])[i] == '(' )
(lines[cy%SCROLLLINES])[i]=' ';
sscanf(lines[cy%SCROLLLINES]," %[0-9a-zA-Z]",pasteword);
SetCtlValue(bar,GetCtlMax(bar));
redraw(numlines_ - (GetCtlMax(bar) - GetCtlValue(bar)) - PAGELINES);
for (i=0;i<strlen(pasteword);++i)
process_char(pasteword[i]);
process_char(0x0d);
}
break;
}
redraw(numlines_ - (GetCtlMax(bar) - GetCtlValue(bar)) - PAGELINES);
if (GetCtlMax(bar) == GetCtlValue(bar)){
macflush();
numlines_--;}
}
else if (ev.what == activateEvt)
InvalRect(&win->portRect);
else if (ev.what == updateEvt && mode == TEXT){
BeginUpdate(textWindow);
lasttop=100000;
redraw(numlines_ - (GetCtlMax(bar) - GetCtlValue(bar)) - PAGELINES);
DrawControls(textWindow);
EndUpdate(textWindow);
}
else if (ev.what == mouseDown && where == inSysWindow)
SystemClick(&ev,win);
else if (ev.what == mouseDown && where == inDrag) {
DragWindow(win,ev.where,&rect);}
else if (ev.what == mouseDown && where == inGoAway)
return (win == gfxWindow ? 1: -1);
if (ev.what == mouseDown && where == inMenuBar){
menu=MenuSelect(ev.where);
menuitem = LoWord(menu);
menuid = HiWord(menu);
if (menuid == 2 && menuitem == 1)
return -1;
if (menuid == 1){
GetPort(&savePort);
GetItem(appleMenu, menuitem, name);
OpenDeskAcc(name);
SetPort(savePort);}
}
else if (collect && mode == TEXT && (ev.what == keyDown))
process_char((char)(ev.message & charCodeMask));
return 1;
}
void macgets(s)
char *s;
{
int status;
collect=true;
if (mode == GFX){
do {status=handleevent();} /* loop until this is false, or hit cr */
while (collect && status);
if (status<= 0) process_window_closure(status);
}
else {
macflush(); /* flush any waiting output (prompt?) */
numlines_--;
inputcount=0;
collect=true; /* tell the event loop to colect chars */
do {status=handleevent();} /* loop until this is false, or hit cr */
while (collect&&(status>0));
if (status<= 0) process_window_closure(status);
inputs[inputcount]=0;
strcpy(s,inputs);
macprintf("\n");
}
}
int macscanf(char *s,...)
{
int i;
char buf[256];
void *p[10];
va_list args;
gets(buf);
va_start(args,s);
for (i=0;i<10;++i)
p[i]=va_arg(args,void *);
va_end(args);
return sscanf(buf,s,p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8],p[9]);
}
void macputs(s)
char *s;
{
macprintf("%s\n",s);
}
macputchar(c)
char c;
{
macprintf("%c",c);
}
void macprintf(char *s,...)
{
char buf[256];
va_list args;
int i;
if (mode == GFX)
return;
if (strcmp(s,"\033[2J\033[H") ==0)
return;
disablescrollback=1;
va_start(args,s);
vsprintf(buf,s,args);
va_end(args);
queryevent();
SetPort(textWindow);
MoveTo(cursorx,cursory);
for (i=0;i<strlen(buf);++i){
if (isprint(buf[i]))
line[linectr++]=buf[i];
else if (buf[i] == '\n'){
macflush();
linectr=0;
macnewline();
}
}
disablescrollback=0;
}
macflush()
{
line[linectr]=0;
if ((memptr+strlen(line) +1) > SCROLLMEM)
memptr=0;
lines[(numlines_)%SCROLLLINES]=&memory[(numlines_%SCROLLLINES)*SCROLLCOLUMNS];
strcpy(lines[(numlines_++)%SCROLLLINES],line);
MoveTo(0,cursory);
putstring(line);
}
macclear()
{
cursorx=0;
cursory=0;
EraseRect(&textrect);
}
macnewline()
{
int i;
cursorx=0;
cursory+=LINEDEPTH;
if (cursory > 260 ){
cursory-=LINEDEPTH;}
MoveTo(cursorx,cursory);
SetCtlMax(bar,((numlines_ > SCROLLLINES ) ? SCROLLLINES :
(numlines_ )) - PAGELINES);
SetCtlValue(bar,GetCtlMax(bar));
redraw(numlines_ - (GetCtlMax(bar) - GetCtlValue(bar)) - PAGELINES);
}
redraw(pos)
int pos;
{
int i,j,y=0;
int lastbot = lasttop+pos;
int delta = pos-lasttop;
int delta2 = lasttop-pos;
int lbound = pos;
int ubound = pos+PAGELINES;
int tmpx = cursorx;
int tmpy = cursory;
if (numlines_ < PAGELINES)
delta=delta2=10000;
textmode();
pos = (pos < 0 ? 0 : pos);
if (delta >= 0 && delta < SCROLLLINES ){
ScrollRect(&textrect,0,-delta*LINEDEPTH,rgn);
lbound = pos+PAGELINES-delta;
}
else if (delta2 > 0 && delta2 < SCROLLLINES ){
ScrollRect(&textrect,0,delta2*LINEDEPTH,rgn);
ubound=delta2+pos;
}
else if (numlines_ >= PAGELINES)
EraseRect(&textrect);
if (numlines_ == ubound)
ubound--;
for (i=pos;i<pos-1+((PAGELINES < numlines_) ? numlines_ : PAGELINES);++i){
MoveTo(0,y);
if (i>= lbound && i<= ubound)
putstring(lines[i%SCROLLLINES]);
y+=LINEDEPTH;
}
MoveTo(0,y);
y+=LINEDEPTH;
lasttop = pos;
MoveTo(tmpx,tmpy);
}
putstring(string)
char *string;
{
char buf[256];
strcpy(buf+1,string);
buf[0]=strlen(string);
DrawString((ConstStr255Param)buf);
cursorx+=StringWidth((ConstStr255Param)buf);
}
textmode()
{
SetPort(textWindow);
SelectWindow(textWindow);
ShowWindow(textWindow);
HideWindow(gfxWindow);
mode = TEXT;
}
gfxmode()
{
int status,ok;
EventRecord ev;
char c;
SetPort(gfxWindow);
ShowWindow(gfxWindow);
HideWindow(textWindow);
SelectWindow(gfxWindow);
mode = GFX;
}
pascal void scroll(c,p)
ControlHandle c;
int p;
{
int direction=((p == inDownButton) ? 1 : (p == 0) ? 0 : -1);
SetCtlValue(bar,GetCtlValue(bar) + direction);
/* redraw(numlines_ - (GetCtlMax(bar) - GetCtlValue(bar)) - PAGELINES);
*/
}
process_char(c)
char c;
{
Rect drect;
if (isprint(c)){
inputs[inputcount++]=c;
line[linectr++]=c;
if (GetCtlValue(bar) == GetCtlMax(bar) && mode==TEXT) {
macflush();
numlines_--;}
}
else{
switch (c){
case 0x03: /* if it's the enter key */
case 0x0d: /* or the return key */
collect=false; /* stop collecting chars */
break;
case 0x08: /* delete */
case 0x1c: /* or back space */
if (inputcount > 0 && mode == TEXT) {
cursorx-=CharWidth(inputs[--inputcount]);
MoveTo(cursorx,cursory);
inputs[inputcount]=0;
drect.top=cursory-LINEDEPTH;
drect.left=0;
drect.bottom=cursory+3;
drect.right=344;
EraseRect(&drect);
line[--linectr]=0;
if (GetCtlValue(bar) == GetCtlMax(bar)){
macflush();
numlines_--;}
}
break;
default:
break;}
}
}
void fixmacfile(filename)
char *filename;
{
OSErr retcode;
FInfo fndrinfo;
char filename1[100];
char filename2[100];
strcpy(filename1,filename);
strcpy(filename2,filename);
retcode=GetFInfo(CtoPstr(filename1),0,&fndrinfo);
fndrinfo.fdType='TEXT';
fndrinfo.fdCreator='MSWD';
retcode=SetFInfo(CtoPstr(filename2),0,&fndrinfo);
}